﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Input;
using CncConvProg.Model;
using CncConvProg.Model.FileManageUtility;
using CncConvProg.Model.Tool;
using CncConvProg.ViewModel.MainViewModel;
using CncConvProg.ViewModel.MVVM_Library;
using MecPrev.Resources;

namespace CncConvProg.ViewModel.Dialog
{
    /// <summary>
    /// Viewmodel per finestra dettagli materiale.
    /// - Lookup materiali
    /// - Lista materiali
    /// </summary>
    public class DettagliMaterialeViewModel : ViewModelBase, IDialog
    {
        /// <summary>
        /// Ctor
        /// </summary>
        public DettagliMaterialeViewModel()
        {
            var m = Singleton.Data.GetPrezziMateriale(Singleton.Instance.MeasureUnit);

            PrezziMaterialiLookUp = new List<PrezzoMateriale>(m);
        }

        public ObservableCollection<DettaglioMaterialeViewModel> DettagliMateriale
        {
            get
            {
                var m = Singleton.Instance.GetDettagliMateriale();
                var r = new ObservableCollection<DettaglioMaterialeViewModel>();
                foreach (var dettaglioArticoloMateriale in m)
                {
                    r.Add(new DettaglioMaterialeViewModel(dettaglioArticoloMateriale));
                }

                return r;
            }
        }

        private DettaglioMaterialeViewModel _dettaglioSelezionato;
        public DettaglioMaterialeViewModel DettaglioSelezionato
        {
            get
            {
                return _dettaglioSelezionato;
            }
            set
            {
                _dettaglioSelezionato = value;
                OnPropertyChanged("DettaglioSelezionato");
            }

        }

        public Dictionary<byte, string> SezioniLookup
        {
            get
            {
                var lookup = new Dictionary<byte, string>
                                 {
                                     {(byte)SezioneType.Tondo, GuiRes.Circle},
                                     {(byte)SezioneType.Piatto, GuiRes.Rectangle},
                                     {(byte)SezioneType.Esagono, GuiRes.Hexagon},
                                     {(byte)SezioneType.Quadro, GuiRes.Square},
                                     {(byte)SezioneType.Tubo, GuiRes.Pipe},

                                 };

                return lookup;

            }
        }

        private List<PrezzoMateriale> _prezziMaterialiLookUp;
        public List<PrezzoMateriale> PrezziMaterialiLookUp
        {
            get
            {
                return _prezziMaterialiLookUp;
            }

            set
            {
                _prezziMaterialiLookUp = value;
                OnPropertyChanged("PrezziMaterialiLookUp");
            }
        }
        #region New Material Detail


        RelayCommand _newMatDetailCmd;
        /// <summary>
        /// Salva modifiche database
        /// </summary>
        private void NewMatDetail()
        {
            var dettaglioMateriale = new DettaglioArticoloMateriale();

            Singleton.Instance.AddMaterialDetail(dettaglioMateriale);

            OnPropertyChanged("DettagliMateriale");
        }

        public ICommand NewMaterialDetailCmd
        {
            get
            {
                return _newMatDetailCmd ?? (_newMatDetailCmd = new RelayCommand(param => NewMatDetail(),
                                                                            param => true));
            }
        }


        #endregion

        #region Del Cmd

        private RelayCommand _delMatDetCmd;

        private void DelMatDetail(DettaglioMaterialeViewModel dettMateriale)
        {
            var m = dettMateriale.DettaglioArticoloMateriale;

            Singleton.Instance.DeleteMaterialDetail(m);

            OnPropertyChanged("DettagliMateriale");

        }

        public ICommand DelMaterialDetailCmd
        {
            get
            {
                return _delMatDetCmd ?? (_delMatDetCmd = new RelayCommand(param => DelMatDetail(param as DettaglioMaterialeViewModel),
                                                                            param => true));
            }
        }

        #endregion

        public void Save(IMainViewModel mainViewModel)
        {
            var mainscreen = mainViewModel as MainViewModel.MainViewModel;

            if (mainscreen != null)
            {
                mainscreen.UpdateMaterialSummary();
            }

        }



    }

    public class DettaglioMaterialeViewModel : ViewModelBase
    {
        public readonly DettaglioArticoloMateriale DettaglioArticoloMateriale;

        public DettaglioMaterialeViewModel(DettaglioArticoloMateriale dettaglioArticoloMateriale)
        {
            DettaglioArticoloMateriale = dettaglioArticoloMateriale;
        }

        public PrezzoMateriale PrezzoMateriale
        {
            get { return DettaglioArticoloMateriale.PrezzoMateriale; }

            set
            {
                if (value == null)
                {
                    DettaglioArticoloMateriale.PrezzoGuid = Guid.Empty;
                    return;
                }

                DettaglioArticoloMateriale.PrezzoGuid = value.PrezzoGuid;

                OnPropertyChanged("PrezzoMateriale");
                IsEditingMaterial = false;
            }
        }

        private bool _isEditingMaterial;
        public bool IsEditingMaterial
        {
            get
            {
                return _isEditingMaterial;
            }

            set
            {
                if (_isEditingMaterial.Equals(value) != true)
                {
                    _isEditingMaterial = value;
                    OnPropertyChanged("IsEditingMaterial");
                }

            }
        }

        public double Lunghezza
        {
            get { return DettaglioArticoloMateriale.Lunghezza; }
            set
            {
                DettaglioArticoloMateriale.Lunghezza = value;
                OnPropertyChanged("Lunghezza");
            }
        }
        public byte Sezione
        {
            get { return (byte)DettaglioArticoloMateriale.Sezione; }
            set
            {
                DettaglioArticoloMateriale.Sezione = (SezioneType)value;
                OnPropertyChanged("Sezione");
            }
        }

        public double DiametroEsterno
        {
            get { return DettaglioArticoloMateriale.DiametroEsterno; }
            set
            {
                DettaglioArticoloMateriale.DiametroEsterno = value;
                OnPropertyChanged("DiametroEsterno");
            }
        }

        public double DiametroInterno
        {
            get { return DettaglioArticoloMateriale.DiametroInterno; }
            set
            {
                DettaglioArticoloMateriale.DiametroInterno = value;
                OnPropertyChanged("DiametroInterno");
            }
        }

        public double LatoMaggiore
        {
            get { return DettaglioArticoloMateriale.LatoMaggiore; }
            set
            {
                DettaglioArticoloMateriale.LatoMaggiore = value;
                OnPropertyChanged("LatoMaggiore");
            }
        }

        public double LatoMinore
        {
            get { return DettaglioArticoloMateriale.LatoMinore; }
            set
            {
                DettaglioArticoloMateriale.LatoMinore = value;
                OnPropertyChanged("LatoMinore");
            }
        }

        public double ChiaveEsagono
        {
            get { return DettaglioArticoloMateriale.ChiaveEsagono; }
            set
            {
                DettaglioArticoloMateriale.ChiaveEsagono = value;
                OnPropertyChanged("ChiaveEsagono");
            }
        }



        protected override void OnPropertyChanged(string property)
        {
            switch (property)
            {
                case "LatoMinore":
                case "LatoMaggiore":
                case "DiametroEsterno":
                case "DiametroInterno":
                case "ChiaveEsagono":
                case "Lunghezza":
                case "Sezione":
                case "PrezzoMateriale":
                    {
                        OnPropertyChanged("PesoUnitario");
                        OnPropertyChanged("PrezzoUnitario");
                    } break;

                default:
                    break;
            }

            base.OnPropertyChanged(property);
        }



        public double PrezzoUnitario
        {
            get { return DettaglioArticoloMateriale.PrezzoUnitario; }
        }

        public double PesoUnitario
        {
            get { return DettaglioArticoloMateriale.PesoUnitario; }
        }

    }
}